//导入express
const express = require('express')
//创建服务器的实例对象
const app = express()
//验证规则
const Joi = require('joi')

//token的解析与生成中间件的引入
const jwt = require("jsonwebtoken")
const expressJwt = require("express-jwt")
//token密钥
const secretKey = 'loveSick'
//注册将JWT字符串解析还原成JSON对象的中间件
/*
    expressJWT({secret:secretKey} 就是用来解析token的中间件
    .unless({path:[/^\/api\//]}) 用来指定哪些接口不需要访问权限
    只要配置成功了这个中间件，就可以把解析出来的用户信息挂载在req.user属性上
    @6版本，需要添加algorithms
 */
app.use(expressJwt({secret:secretKey,algorithms: ["HS256"]}).unless({path:[/^\/user\//,/^\/homePage\//,/^\/inquire\//]}))

//配置解析数据表单的中间件
const bodyparser = require('body-parser');
app.use(bodyparser.urlencoded({extended:true}));
app.use(bodyparser.json())

//配置跨域
const cors = require('cors')
app.use(cors())

//导入模块路由
const classificationRouter = require('./router/classification')
app.use('/homePage',classificationRouter)
const userRouter = require('./router/user')
app.use('/user',userRouter)
const inquireRouter = require('./router/cityDataInquire')
app.use('/inquire',inquireRouter)

//使用全局错误处理中间件，捕获解析JWT失败后产生的错误
app.use((err, req, res, next) =>{
    //这次错误是由token解析失败导致
    if (err.name === 'UnauthorizedError'){
        console.log(err)
        return res.send({
            status:401,
            msg:'无效的token'
        })
    }else if (err instanceof Joi.ValidationError){
        return res.send({
            status:400,
            message:err.message
        })
    }
    res.send({
        status:500,
        msg:'未知的错误'
    })
})

//启动服务器
app.listen(3000, ()=>{
    console.log('API server running at http://127.0.0.1:3000')
})
